# 本脚本用于画图（线程调度）

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 从CSV文件中读取数据
csv_file = '../results_raw/dpa_thread_analyze_v2.csv'
data = pd.read_csv(csv_file)

# 筛选出 batch_size 为 8192 的数据
batch_size = 8192
filtered_data = data[data['batch_size'] == batch_size]

# 按 thread_num 排序以确保正确的顺序
filtered_data = filtered_data.sort_values('thread_num')

# 提取数据
thread_nums = filtered_data['thread_num'].values
p50_times = filtered_data['p50_time'].values
thread_ratios = filtered_data['thread_ratio'].values

# 计算每个部分的高度（微秒）
execution_times = p50_times * (thread_ratios / 100)  # 每个线程运行耗时
scheduling_times = p50_times - execution_times       # 线程调度耗时

# 创建均匀分布的x坐标（索引位置）
x_positions = np.arange(len(thread_nums))

# 设置图形
plt.figure(figsize=(14, 8))

# 创建堆叠柱状图 - 使用索引位置，宽度设为0.8填满间隔
bar_width = 0.8
bars_execution = plt.bar(x_positions, execution_times, width=bar_width, 
                         color='#1f77b4', label='time-per-thread-execute')
bars_scheduling = plt.bar(x_positions, scheduling_times, width=bar_width, 
                          bottom=execution_times, color='#ff7f0e', label='time-thread-manage')

# 添加分隔线（表示分割点）
for i, pos in enumerate(x_positions):
    plt.hlines(execution_times[i], pos - bar_width/2, 
               pos + bar_width/2, colors='white', linewidth=1.5)

# 添加数据标签
for i, pos in enumerate(x_positions):
    # 在每个柱形顶部添加总时间标签
    plt.text(pos, p50_times[i] + 0.05 * max(p50_times), 
             f'{p50_times[i]:.1f} us', 
             ha='center', va='bottom', fontsize=9)
    
    # 在分割线位置添加比例标签
    plt.text(pos, execution_times[i], 
             f'{thread_ratios[i]}%', 
             ha='center', va='bottom', fontsize=9, color='white', weight='bold')

# 添加标题和标签
plt.title(f'Dpa thread-time analyze (batch_size = {batch_size})', fontsize=14)
plt.xlabel('(thread_num)', fontsize=12)
plt.ylabel('P50 latency (us)', fontsize=12)

# 设置均匀分布的x轴刻度和标签
plt.xticks(x_positions, thread_nums, fontsize=10)
plt.yticks(fontsize=10)

# 添加图例
plt.legend(loc='upper right', fontsize=12)

# 添加网格线
plt.grid(axis='y', linestyle='--', alpha=0.7)

# 调整布局
plt.tight_layout()

# 保存图像
plt.savefig(f'thread_performance_batch_v2_{batch_size}.png', dpi=300)

# 显示图像
plt.show()
